<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241213003519.png"/>


当产品的PRD评审完成后，就能立刻进入编码了吗？


绝对不可能！当你拿到需求以后需要做的不是立刻进入编码，而是要视需求大小进行不同层级的系统设计，这个过程包括：要拆解出属于此项目的各项人员职责、决定采用一个什么的架构来承接、各个功能模块如何细化设计、涉及到的库表要如何设计、分支计划是什么样、列出工程导图，最后要准备一个执行进度的汇总表分别统计开发到上线阶段的各项进度把控风险，直至项目开发完成发出上线报告推进项目上线交付，至此才算是一趟完整的旅程。


## 职责总表

一般使用专门的系统或者一个excel表，记录前端、后端、UI、需要配合的外部、运维和测试，这些人员的在此项目的工作职责、预估工期、启动时间和预计完成时间。方便在项目开发阶段可以明确的找到各个模块对应的负责人员，减少一定的沟通成本。

## 系统架构

负载(LVS、F5、Nginx)、网关(Zuul、Gateway、自研)、结构(DDD、MVC、SOA)、治理(RateLimiter、HyStrix、netflix)、框架(Spring、SpringBoot、MyBatis)、服务(RPC、MQ、分布式任务、配置中心)、数据(ES、HBase、Mysql&分库分表)，七个模块是整个搭建系统架构过程中必须考虑到的点。一般在公司内部这些基本是固定成型的，除非是系统有升级或者之前没到的新技术才会重新设计架构。

## 功能模块

在系统架构制定完成后，就需要把具体的需求拆分到各个人员手里进行细节设计，包括：服务领域的拆分、功能细节实现、网关接口包装等，这些细节的设计可以更好的评估出指定人员完成此需求的工期，算是包产到户的感觉。

## 库表设计

在整个研发设计阶段，库表的设计是非常核心和重要的，这将决定着一个系统在开发阶段对数据的存储和使用是否方便，以及后续扩展不同需求时候，是否会折腾库表继续扩展。所以详细设计库表结构，底层结构的完善建设，有利于将来系统服务的扩展。另外一般对于较大型的系统开发，需要设计分库分表，那么分库分表后就还需要考虑把数据通过类似otter的工具，通过binlog把数据同步到ES，方便查询和使用。

## 分支计划

千万别小看这样一个小小规则的定义，就这样一个约定的规则，可能在某些时候会避免一些错误分支的提交、删除、误合并。因为一个需求可能会涉及较多系统共同开发，所以明确一个统一的分支名称，和分支范围可以更好的约束代码提交，也更能顺利的推进后续测试、预发、上线流程。（关于分支的命名规范，通常会采用时间、开发者、开发内容，组合一个分支名称）

## 工程导图
如果你的系统设计涉及的内容不少，而且需要协同各方来配合开发，那么把这样的功能模块梳理到如 xmind 思维导图以及配合 visio 展示给会议评审的参与者时，能尽快地让大家在共同的语境下交流，更好地减少沟通成本。
## 进度汇总

在项目开发和上线阶段，如果要保证项目的进度，就需要做一些进度汇总和风险暴露的策略制定。比如一个敏捷项目需要每天开发日会，汇总研发的开发进度、测试的用例进度、产品的补全进度、运营的配合进度等，这些交叉信息的汇聚，会尽可能避免出现，“你认为、你觉得”这样的事情的发生，提早暴露和规避临近测试和上线时暴露的风险。

## 上线计划
最后在项目测试接近尾声，测试报告即将发送出来前，需要梳理上线计划。这会涉及到此项目开发过程中的内部、外部人员，他们需要在项目上线时进行配合提供接口或者服务验证。另外上线前还需要提前准备好所需要的上线资源，包括：服务器、数据库、组件授权、服务配置、权限开通、埋点数据等等。也需要提前与运营沟通配合上线过程中一些需要业务运营配置的内容，提前准备好，方便线上验证时使用。
综上，就是整个开发阶段涉及的系统架构设计，系统设计不仅仅是单独说只是一个需求的实现设计，还会涉及上下游的很多信息都会包括，可能你目前只是整个项目开发中的一环，但如果你能站在一个全局的视角来看，就会发现这里涉及的内容会非常多，也是一个架构师应该掌握的技能。